home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / phmon.ada < prev    next >
Text File  |  1996-01-30  |  967b  |  40 lines

  1. package Phil_Monitor is
  2.  
  3.   procedure Take_Fork(I: Integer);
  4.   procedure Release_Fork(I: Integer);
  5.  
  6. end Phil_Monitor;
  7.  
  8. with Monitor_Package; use Monitor_Package;
  9. package body Phil_Monitor is
  10.  
  11.   Fork: array(0..4) of Integer := (others => 2);
  12.   OK_to_Eat: array(0..4) of Condition;
  13.  
  14.   procedure Take_Fork(I: Integer) is
  15.   begin
  16.     Monitor.Enter;
  17.     if Fork(I) /= 2 then
  18.       Monitor.Leave;
  19.       Ok_to_Eat(I).Wait;
  20.     end if;
  21.     Fork((I+1) mod 5) := Fork((I+1) mod 5) - 1;
  22.     Fork((I-1) mod 5) := Fork((I-1) mod 5) - 1;
  23.     Monitor.Leave;
  24.   end Take_Fork;
  25.  
  26.   procedure Release_Fork(I: Integer) is
  27.   begin
  28.     Monitor.Enter;
  29.     Fork((I+1) mod 5) := Fork((I+1) mod 5) + 1;
  30.     Fork((I-1) mod 5) := Fork((I-1) mod 5) + 1;
  31.     if Fork((I+1) mod 5) = 2 then
  32.       OK_to_Eat((I+1) mod 5).Signal;
  33.     end if;
  34.     if Fork((I-1) mod 5) = 2 then
  35.       OK_to_Eat((I-1) mod 5).Signal;
  36.     end if;
  37.   end Release_Fork;
  38.  
  39. end Phil_Monitor;
  40.